package com.controller;


import com.annotation.IgnoreAuth;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.entity.ConfigEntity;
import com.service.ConfigService;
import com.utils.PageUtils;
import com.utils.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Arrays;
import java.util.Map;

/**
 * 配置相关
 */
@RequestMapping("config")
@RestController
public class ConfigController {

    @Autowired
    private ConfigService configService;

    /**
     * 列表页面
     * @param params 查询参数，通常包含分页信息和筛选条件
     * @param config 配置实体，用于传递与配置相关的数据
     * @return 返回一个Result对象，封装了分页后的配置数据
     */
    @RequestMapping("/page")
    public R page(@RequestParam Map<String, Object> params, ConfigEntity config) {
        // 创建一个实体包装器，用于后续的查询条件封装
        EntityWrapper<ConfigEntity> ew = new EntityWrapper<ConfigEntity>();
        // 调用服务层方法，根据参数查询分页数据
        PageUtils page = configService.queryPage(params);
        // 返回成功结果，携带分页数据
        return R.ok().put("data", page);
    }

    /**
     * 显示配置列表
     * 此方法用于处理配置列表的请求。它不需要认证，即任何用户都可以请求此列表。
     * 方法接受一个参数映射和一个ConfigEntity类型的对象。参数映射用于接收查询参数，
     * 而ConfigEntity对象用于封装与配置相关的数据。
     * @param params 包含查询参数的映射。这些参数用于分页和过滤结果。
     * @param config ConfigEntity类型的对象，用于封装配置数据。
     * @return 返回一个R对象，其中包含一个PageUtils对象，该对象持有分页后的配置数据。
     */
    @IgnoreAuth
    @RequestMapping("/list")
    public R list(@RequestParam Map<String, Object> params, ConfigEntity config) {
        // 创建一个配置实体的条件包装器。这个包装器可以用于构建查询条件。
        EntityWrapper<ConfigEntity> ew = new EntityWrapper<ConfigEntity>();
        // 使用服务方法查询分页后的配置数据，并将结果存储在PageUtils对象中。
        PageUtils page = configService.queryPage(params);
        // 创建一个成功的响应，并将分页后的数据放入响应中，然后返回。
        return R.ok().put("data", page);
    }

    /**
     * 获取配置信息
     * 通过配置的ID来获取详细的配置信息。
     * 使用了 @PathVariable 来从请求的URL中提取ID参数。
     * @param id 配置的ID，从URL路径参数中获取
     * @return 返回配置信息封装在R对象中，使用R.ok()方法表示操作成功，并将配置实体放入返回数据中
     */
    @RequestMapping("/info/{id}")
    public R info(@PathVariable("id") String id) {
        // 通过服务方法根据ID查询配置实体
        ConfigEntity config = configService.selectById(id);
        // 返回查询到的配置信息，包含在返回对象的数据部分
        return R.ok().put("data", config);
    }


    /**
     * 查询配置详情
     * 通过ID查询配置实体，并返回查询结果
     * 该方法忽略了认证，即不需要权限认证即可访问
     * @param id 配置的ID
     * @return 查询到的配置实体，包含在返回结果的"data"字段中
     */
    @IgnoreAuth
    @RequestMapping("/detail/{id}")
    public R detail(@PathVariable("id") String id) {
        ConfigEntity config = configService.selectById(id);
        return R.ok().put("data", config);
    }


    /**
     * 根据名称获取配置信息
     * @param name 配置项的名称
     * @return 返回配置项的信息，包括配置值和其他相关数据
     * 通过@RequestParam注解获取请求中传递的名称参数
     * 使用configService查询数据库中与给定名称匹配的配置项
     * 最后通过R.ok().put("data", config)返回成功响应，包含配置项的数据
     */
    @RequestMapping("/info")
    public R infoByName(@RequestParam String name) {
        // 根据名称查询配置项
        ConfigEntity config = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "faceFile"));
        // 返回包含配置数据的响应
        return R.ok().put("data", config);
    }


    /**
     * 保存配置信息
     * @param config 配置实体对象，包含要保存的配置信息
     * @return R 返回操作结果，"ok"表示操作成功
     */
    @PostMapping("/save")
    public R save(@RequestBody ConfigEntity config) {
//    	ValidatorUtils.validateEntity(config);
        configService.insert(config);
        return R.ok();
    }


    /**
     * 更新配置信息
     * 该方法用于更新系统配置信息，接收一个ConfigEntity对象作为参数，该对象包含了需要更新的配置的所有字段
     * 使用了@RequestMapping注解来指定处理的HTTP请求为PUT类型，对应到"/update"这个请求路径
     * 方法体内，首先会使用ValidatorUtils.validateEntity(config)来校验传入的ConfigEntity对象是否合法，
     * 然后调用configService.updateById(config)方法来完成实际的更新操作，最后返回一个表示操作成功的R对象
     * @param config 包含更新信息的ConfigEntity对象
     * @return 表示操作结果的R对象，这里表示操作成功
     */
    @RequestMapping("/update")
    public R update(@RequestBody ConfigEntity config) {
//        ValidatorUtils.validateEntity(config); // 校验config对象的字段是否合法
        configService.updateById(config); // 调用service层的updateById方法，使用传入的config对象更新数据库中的相应记录
        return R.ok(); // 返回一个表示操作成功的R对象
    }


    /**
     * 批量删除配置项
     * 该方法通过接收一组配置项的ID来实现批量删除功能
     * 使用了@RequestBody注解来解析请求体中的ID数组，这使得前端可以发送POST请求并包含ID列表作为请求体的数据
     * @param ids 需要删除的配置项的ID数组，通过请求体传递
     * @return 删除操作的结果，使用R对象封装，表示操作成功的响应
     */
    @RequestMapping("/delete")
    public R delete(@RequestBody Long[] ids) {
        configService.deleteBatchIds(Arrays.asList(ids));
        return R.ok();
    }

}
